//
// Created by Administrator on 2021/9/29.
//

#ifndef MRENDER_STRING_H
#define MRENDER_STRING_H
#include <string>
#include <cstdarg>
#include <cstring>
#include <sstream>
#include <vector>
#include <regex>

#define STR_LENGTH	2048 //最大文本长度

/**
 * 自定义字符串类，不允许继承。
 */

class String final{
private:
    std::string self;
public:
    String();
    String(const std::string& s);
    String(const char* s);

    // 字符串运算符重载
    String operator + (const char* s) const;
    String operator + (const String s) const;
    String operator + (const long d) const;
    void operator += (const char* s);
    void operator += (const std::string& s);
    void operator += (const String& s);
    bool operator == (const String& s) const;

    /**
     * 获得原始字符串
     * @return
     */
    const std::string &getSelf() const;

    /**
     * 字符串长度
     * @return
     */
    int length();

    /**
     * 判断为空
     * @return 结果
     */
    bool empty();

    /**
     * 转为 char*
     * @return char*
     */
    const char * c_str() const;

    /**
     * 转为 char*
     * @return
     */
    char * toC_str();

    /**
     * 字符在字符串中最开始出现的索引值
     * @param c 字符
     * @return 索引，如果不存在返回 -1
     */
    int indexOf(char c);

    /**
     * 字符在字符串中最后出现的索引值
     * @param c 字符
     * @return 索引，如果不存在返回 -1
     */
    int lastIndexOf(char c);

    /**
     * 截取字符串，原字符串不变
     * @param start 起始索引
     * @param end 终止索引
     * @return 截取后字符串
     */
    String subStr(unsigned int start,unsigned  int end);

    /**
     * 字符串分割
     * @param splitStr 分隔符
     * @param outArray 分割后数组
     */
    void split(String splitStr, std::vector<String> &outArray);

    /**
      * 字符串分割,支持正则表达式
      * @param regex 分隔符,支持正则表达式
      * @param outArray 分割后数组
     */
    void splitWithRegex(String regex, std::vector<String> &outArray);

    /**
     * 获得类名
     */
    static String getClassName(String filePath);

    /**
     * 获取文件名+后缀
     * @param filePath 文件路径
     * @return 文件名+后缀
     */
    static String getFileName(String filePath);

    /**
     * int 转 字符串
     * @param i 数字
     * @return 字符串
     */
    static String toString(int i);

    /**
     * float 转 字符串
     * @param f 数字
     * @return 字符串
     */
    static String toString(float f);

    /**
     * 格式化字符串
     * @param fmt 模板
     * @param ... 变量
     * @return 格式化字符串
     */
    static String toString(const char* fmt, ...);

    /**
     * 去除首尾空格
     * @return
     */
    String trim();

    /**
     * 判断是否以head开头
     * @param head
     * @return
     */
    bool startWith(String head);

    /**
     * 转int
     * @return
     */
    int toInt();

    /**
     * 转double
     * @return
     */
    double toDouble();
};


#endif //MRENDER_STRING_H
